package onjava.generics;

// generics/LinkedStack.java
// (c)2021 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// A stack implemented with an internal linked structure

/**
 * 简单泛型 -> 栈类
 * 
 * 自定义的内部链式存储机制
 *
 * @author Lucky Yang
 */
public class LinkedStack<T> {
  private static class Node<U> {
    U item;
    Node<U> next;

    Node() {
      item = null;
      next = null;
    }

    Node(U item, Node<U> next) {
      this.item = item;
      this.next = next;
    }

    boolean end() {
      return item == null && next == null;
    }
  }

  /** 末端哨兵（End sentinel): 检查栈何时为空 */
  private Node<T> top = new Node<>();

  public void push(T item) {
    top = new Node<>(item, top);
  }

  public T pop() {
    T result = top.item;
    if (!top.end()) {
      top = top.next;
    }
    return result;
  }

  public static void main(String[] args) {
    LinkedStack<String> lss = new LinkedStack<>();
    String[] messages = "Phasers on stun!".split(" ");
    for (String s : messages) {
      lss.push(s);
    }
    String s;
    while ((s = lss.pop()) != null) {
      System.out.println(s);
    }
  }
}
/*
 * Output:
 * stun!
 * on
 * Phasers
 */
